SPB Git forge

spb/ai-atlas

Public
41commits 1branches 0releases
4.6 MBsize
maindefault branch
12 days agolast push
HTML 77.2% TypeScript 10.5% Python 9.6% JavaScript 2.5%
1.8 KB · 38 lines tsx
Raw Blame History
1import type { Metadata } from 'next';2import { notFound, permanentRedirect } from 'next/navigation';3import { ArtifactPage, describeArtifact } from '@/components/entity/artifact-page';4import { ApiError, apiD1, safe } from '@/lib/api';5import { routes, SITE_NAME, SITE_URL } from '@/lib/site';6import type { ModelDetail } from '@/lib/types';78type Params = { params: Promise<{ slug: string }> };910async function load(slug: string): Promise<ModelDetail> {11  try {12    return await apiD1.model(slug);13  } catch (e) {14    if (e instanceof ApiError && e.notFound) notFound();15    throw e;16  }17}1819export async function generateMetadata({ params }: Params): Promise<Metadata> {20  const { slug } = await params;21  const d = await safe(apiD1.model(slug));22  if (!d || d.entity_type !== 'artifact' || d.slug !== slug) return { title: 'Artifact', robots: { index: false } };23  const kind = d.artifact_kind ?? 'artifact';24  const title = `${d.name} — ${kind.charAt(0).toUpperCase()}${kind.slice(1)} of ${d.canonical?.name ?? 'a model'}`;25  const description = describeArtifact(d);26  const canonical = routes.artifact(d.slug);27  return { title, description, alternates: { canonical }, openGraph: { title: `${title} | ${SITE_NAME}`, description, url: `${SITE_URL}${canonical}`, type: 'article', siteName: SITE_NAME }, twitter: { card: 'summary_large_image', title, description } };28}2930export default async function ArtifactRoute({ params }: Params) {31  const { slug } = await params;32  const d = await load(slug);33  // A model slug under /artifacts → its canonical URL; unknown types → 404.34  if (d.entity_type !== 'artifact') permanentRedirect(routes.entity(d));35  if (d.slug !== slug) permanentRedirect(routes.artifact(d.slug));36  return <ArtifactPage d={d} canonical={routes.artifact(d.slug)} />;37}38